#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>


//多进程版本的程序替换
int main()
{
	pid_t id = fork();
	if(id == 0)
	{
		//child
		printf("i am child process: exec begin...\n");
		//execl("/usr/bin/ls","ls","-a","-l",NULL);
		//execlp("ls","HF","-l",NULL);
		char*const argv[] = {(char*)"ls",(char*)"-l",NULL};
		sleep(3);
		execv("/usr/bin/ls",argv);
		printf("exec end...\n");
		exit(1);
	}
	pid_t rid = waitpid(id,NULL,0);
	if(rid > 0)
	{
		printf("i am father: wait success\n");
	}
	return 0;
}


// int main()
// {
// 	printf("i am a process.mypid: %d\n",getpid());
// 	printf("exec begin....\n");
// 	//execl("/usr/bin/ls","ls","-a","-l",NULL);
// 	execl("/usr/bin/top","top",NULL);
// 	printf("exec end....\n");
// 	return 0;
// }

// // waitpid测试代码
// int main()
// {
// 	pid_t id = fork();
// 	if (id == 0)
// 	{
// 		// child
// 		int cnt = 5;
// 		while (cnt)
// 		{
// 			printf("Child is running,pid: %d,ppid: %d\n", getpid(), getppid());
// 			sleep(1);
// 			cnt--;
// 		}
// 		printf("子进程准备退出，马上变成僵尸进程\n");
// 		exit(1);
// 	}
// 	printf("父进程sleep中.......\n");
// 	sleep(10);
// 	int status = 0;
// 	pid_t rid = waitpid(id, &status, 0); // 阻塞等待
// 	if (rid > 0)
// 	{
// 		printf("wait success, rid: %d,status: %d\n", rid, status);
// 		// 	printf("通过移位运算符解析：\n");
// 		// 	printf("提取退出状态码:%d\n",((status) & 0xFF00) >> 8);
// 		// 	printf("提取终止信号:%d",(status) & 0x7F);
// 		printf("通过宏定义解析：");
// 		printf("子进程正常退出？:%d\n",WIFEXITED(status));	// 子进程正常退出？
// 		printf("退出码：%d\n",WEXITSTATUS(status)); // 获取退出状态码（0~255）
// 		printf("子进程是否被信号终止？：%d\n",WIFSIGNALED(status)) ;// 子进程被信号终止？
// 		printf("退出信号：%d\n",WTERMSIG(status));// 获取终止信号编号
// 	}
// 	printf("父进程回收僵尸成功\n");
// 	sleep(3);
// 	return 0;
//}

// wait的测试代码
//  int main()
//  {
//  	pid_t id = fork();
//  	if(id == 0)
//  	{
//  		//child
//  		int cnt = 5;
//  		while(cnt)
//  		{
//  			printf("Child is running,pid: %d,ppid: %d\n",getpid(),getppid());
//  			sleep(1);
//  			cnt--;
//  		}
//  		printf("子进程准备退出，马上变成僵尸进程\n");
//  		exit(0);

// 	}
// 	printf("父进程sleep中.......\n");
// 	sleep(10);
// 	//father
// 	pid_t rid = wait(NULL);//阻塞等待
// 	if(rid > 0)
// 	{
// 		printf("wait success,rid: %d\n",rid);
// 	}
// 	printf("父进程回收僵尸成功\n");
// 	sleep(3);
// 	return 0;
// }

// //进程收到信号的场景
// int main()
// {
// 	while(1)
// 	{
// 		printf("process is running,pid: %d\n",getpid());
// 		sleep(1);
// 	}
// 	return 0;
// }

// 自定义错误码描述
//  enum
//  {
//  	success = 0,
//  	open_err,
//  	malloc_err
//  };

// const char* errorToDesc(int code)
// {
// 	switch(code)
// 	{
// 		case success:
// 			return "success\n";
// 		case open_err:
// 			return "file open error\n";
// 		case malloc_err:
// 			return "malloc error\n";
// 		default:
// 		return "unknown error\n";
// 	}
// }

// int main()
// {
// 	printf("%s",errorToDesc(0));
// 	printf("%s",errorToDesc(1));
// 	printf("%s",errorToDesc(2));
// 	return 0;
// }
